package com.tbit.uqbike.webmanager.dao.core;


import com.tbit.manager.api.dto.UserStatParam;
import com.tbit.uqbike.object.pojo.DepositCount;
import com.tbit.uqbike.object.pojo.User;
import com.tbit.uqbike.object.pojo.dto.BatchRegisterAuthDTO;
import com.tbit.uqbike.object.pojo.dto.CommonDTO;
import com.tbit.uqbike.object.pojo.dto.UserDTO;
import com.tbit.uqbike.object.pojo.statistics.SexPieData;
import com.tbit.uqbike.object.pojo.vo.UserVO;
import com.tbit.uqbike.object.view.NameObject;

import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 用户dao
 *
 * @author Leon
 * 2017年2月24日 下午4:02:36
 */
public interface UserDao {

    /**
     * 新增用户
     *
     * @param user 用户对象
     */
    void insert(User user);

    /**
     * 查询个数
     *
     * @param params
     * @return
     */
    Integer queryCount(Map<String, Object> params);

    /**
     * 查询详细
     *
     * @param params
     * @return
     */
    List<User> queryPage(Map<String, Object> params);

    /**
     * 用户
     *
     * @param
     * @return
     */
    List<User> getByAccountIdAndPhone(Map<String, Object> params);

    /**
     * 根据身份证号码查询用户
     *
     * @param
     * @return
     */
    List<User> getByAccountIdAndIdNo(Map<String, Object> params);

    /**
     * 用户
     *
     * @param params
     * @return
     */
    User getByAccountAndPhone(Map<String, Object> params);

    /**
     * 更加用户id查询
     *
     * @param userId
     * @return
     */
    User getByUserId(Integer userId);

    /**
     * 选择用户id
     *
     * @param userId 用户id
     * @return {@link User}
     */
    User selectByUserId(Integer userId);

    /**
     * 批量查询用户
     *
     * @param params
     * @return
     */
    List<User> getByUserIdBatch(Map<String, Object> params);

    List<User> getByUserIds(Map<String, Object> params);

    /**
     * 获取用户通过电话
     *
     * @param commonDTO 常见dto
     * @return {@link User}
     */
    User getUserByPhone(CommonDTO commonDTO);

    /**
     * 更新账户金额
     *
     * @param params
     */
    void updateMoney(Map<String, Object> params);

    /**
     * 给用户的欠款金额赋值
     *
     * @param userId 用户id
     */
    void assignmentRideMoney(Integer userId);

    /**
     * 冻结押金
     *
     * @param params
     */
    void frozenDeposit(Map<String, Object> params);

    /**
     * 更新押金支付状态
     *
     * @param params
     */
    void updateDeposit(Map<String, Object> params);

    /**
     * 实名认证更新
     *
     * @param params
     */
    void updateStudentAuth(Map<String, Object> params);

    /**
     * 清空实名认证信息
     *
     * @param userId
     */
    void editNameAuth(Integer userId);

    /**
     * 实名认证
     *
     * @param params
     */
    void updateNameAuth(Map<String, Object> params);

    /**
     * 根据品牌id和身份证号查询
     *
     * @param params
     * @return
     */
    List<User> getByAccountAndIdNO(Map<String, Object> params);

    /**
     * 通过区域运营商id查询
     */
    User getByAdaccountId(Map<String, Object> params);

    /**
     * 性别分组
     */
    List<NameObject> groupBySex(Map<String, Object> params);

    /**
     * 年龄分组
     */
    List<NameObject> groupByBirth(Map<String, Object> params);

    /**
     * 新增用户按天分组或按月分组
     */
    List<NameObject> statByType(Map<String, Object> params);

    /**
     * 统计平台用户总数、总金额、总欠款
     */
    Integer countByType(Map<String, Object> params);

    /**
     * 押金统计
     */
    DepositCount countDeposit(Integer accountId);

    List<Integer> getByBirthDay(String birth);

    /**
     * 根据区域获取用户
     */
    User getByAreaId(Map<String, Object> map);


    int updateUser(User user);

    List<UserDTO> getUserList(@Param("user") User user, @Param("pageNo") int pageNo, @Param("excelCount") int excelCount);

    List<Map<String, Object>> arrearsStatistics(Map<String, Object> map);


    /**
     * 更新用户余额
     *
     * @param userId
     * @param newUserMoney
     * @param newUserRideMoney
     * @param now
     */
    void updateUserMoney(@Param("userId") Integer userId, @Param("newUserMoney") Long newUserMoney, @Param("newUserRideMoney") Long newUserRideMoney, @Param("now") Date now);

    /**
     * 修改用户骑行分
     *
     * @param userId      用户id
     * @param modifyScore 变动值
     */
    void updateUserRidingScore(@Param("userId") Integer userId, @Param("modifyScore") Integer modifyScore);

    void clearStudentAuth(@Param("userId") Integer userId);

    void batchInsertOrUpdate(List<BatchRegisterAuthDTO> list);

    List<BatchRegisterAuthDTO> selectInAccountIdAndPhoneAndCountry(List<BatchRegisterAuthDTO> list);

    List<User> getIdByAccountIdAndPhoneAndNameAndIdNo(Integer accountId, String phone, String name, String idNo);
    /**
     * 根据手机号码查询
     *
     * @param params
     * @return
     */
    User getByPhone(Map<String, Object> params);
    /**
     * 查询用户看板
     *
     * @param userId 用户id
     */
    UserVO getInfoByUserId(Integer userId);

    /**
     * 查询区域总用户数
     * 截至右区间的时间
     * @param param
     * @return
     */
    Long totalUserCount(@Param("param") UserStatParam param);

    /**
     * 查询区域实名用户总数
     * 截至右区间的时间
     * @param param
     * @return
     */
    Long nameAuthUserCount(@Param("param") UserStatParam param);

    /**
     * 获取时间区间内区域中获取年龄分布饼状图
     * @param param
     * @return
     */
    List<LocalDate> getUserBirthDayList(@Param("param") UserStatParam param);

    /**
     * 获取时间区间内性别分布饼状图
     * @param param
     * @return
     */
    @MapKey("sex")
    Map<String, SexPieData> sexDistributionPieChart(@Param("param") UserStatParam param);


    List<User> selectByPhoneList(@Param("phoneList") List<String> phoneList, @Param("brandId") Integer brandId);
}